# -*- coding: utf-8 -*-
# https://mp.weixin.qq.com/s/xg4ZiYUsvcu2CQ5rMOX1Wg
# 代码清单1：for语句遍历提取str
# 单纯遍历的for语句
names = ['Michael', 'Bob', 'Tracy']
# 遍历输出names中的元素
for name in names:
    print(name)

# 代码清单2：for语句遍历查询dict
dic = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
# 遍历键值对
print('key_value：', end='')
for key, value in dic.items():
    print(key, value, sep=':', end=' ')
# 遍历键
print('keys：', end='')
for key in dic.keys():
    print(key, end=' ')
# 遍历值
print('values：', end='')
for value in dic.values():
    print(value, end=' ')

# 代码清单3：嵌套for语句
students = ['小明', '小红']
subjects = ['语文', '数学']
sum1 = []
avg = []
for i in students:
    print('开始录入%s的考试成绩!' % i)
    sum = 0
    for j in subjects:
        print('请输入%s成绩:' % j)
        score = int(input())
        sum += score
    average = sum / 2
    avg.append(average)
    sum1.append(sum)
print(students, '的总分依次是', sum1, ',', '平均分依次是', avg)
print('完成成绩录入！')

# 代码清单4：while语句
sum = 0
n = 99
while n > 0:
    sum += n
    n -= 2
print(sum)

# 代码清单5：while语句无限循环

# 布尔表达式为常数1，始终为真值
while 1:
    print('循环')
# 布尔表达式每次递归运算都为2，始终为真值
x, y = 2, 1
while x / y:
    print('循环')
    x = x * 2
    y = y * 2

# 代码清单6：while语句实现str截取
string = 'abcd'
while string:
    print(string)
    # 该语句的递归计算是，每次从str的第2个字符开始截取
    string = string[1:]

# 代码清单7：嵌套while语句
j = 1
while j <= 2:
    sum = 0
    i = 1
    name = input('请输入学生姓名:')
    while i <= 2:
        print('请输入第%d门的考试成绩: ' % i)
        sum += int(input())
        i += 1
    avg = sum / (i - 1)
    print(name, '的平均成绩是%d' % avg)
    j += 1
print('学生成绩输入完成！')

# 代码清单8：break语句的使用
# break语句用于for循环
string = "Python"
for i in string:
    # 遍历至string中的字符n时，不再执行else代码块
    if i == 'n':
        break
    else:
        print("letter：{}".format(i))
# break语句用于while循环
counts = 0
while True:
    print(counts)
    counts += 1
    # 满足counts等于3时跳出循环，不再进入循环体
    if counts == 3:
        break

# 代码清单9：break语句用于嵌套循环结构
# 第1层循环，遍历次数为2
for i in range(2):
    print("-----%d-----" % i)
    # 第2层循环，遍历次数为10
    for j in range(10):
        # 使用break语句，j>1时不执行循环体
        if j > 1:
            break
        print(j)

# 代码清单10：continue语句用于循环结构
# 当i等于1或3时，跳过continue后的print语句
for i in range(0, 5):
    if i == 1 or i == 3:
        continue
    print(i)

# 如果遇到偶数，跳过continue后的print语句
counts = 0
while counts < 10:
    counts += 1
    if counts % 2 == 0:
        continue
    print(counts)

# 代码清单11：continue语句用于嵌套循环结构
# 第1层循环，遍历次数为2
for i in range(2):
    print("-----%d-----" % i)
    # 第2层循环，遍历次数为5
    for j in range(5):
        # 当j等于2或4时，不执行循环体
        if j == 2 or j == 4:
            continue
        print(j)

# 代码清单12：pass语句
for element in "Python":
    # element为y时，不做任何操作，不会被输出
    if element == "y":
        pass
    else:
        print(element)

counts = 0
while counts < 5:
    counts += 1
    # i=3时，不执行循环体
    if counts == 3:
        pass
    else:
        print(counts ** 2)

# 代码清单13：使用列表推导式生成list

vec = [-4, -2, 0, 2, 4]
# 用vec中元素的倍数，创建一个数组
print([x * 2 for x in vec])

# 创建一个包含2元tuple的list
print([(x, x ** 2) for x in range(6)])

# 代码清单14：包含条件语句的列表推导式
# 过滤list，删除list中的负数
print([x for x in vec if x >= 0])

# 代码清单15：常规方式与列表推导式对比
# 创建一个平方数list：常规方式
squares = []
for x in range(10):
    squares.append(x ** 2)
print(squares)

# 创建一个平方数list列表推导式
squares = [x ** 2 for x in range(10)]
print(squares)

# 代码清单16：包含嵌套循环的列表推导式
# 打印由tuple组成的list，tuple中i由0至2，j由0至2
[(i, j) for i in range(0, 3) for j in range(0, 3)]
# 打印由tuple组成的list，i在0至2之间且小于1，j在0至2之间且大于1
[(i, j) for i in range(0, 3) if i < 1 for j in range(0, 3) if j > 1]
